<?php
namespace Tbf\Util;
/**
 * 各种有关反射的简单封装
 */
/**
 * @deprecated
 */
class ReflectionUtil
{
    /**
     * 返回类里面所有的属性的反射对象
     * 包括parent类里面的私有变量
     * */
    public static function getObjectAttr($obj)
    {
        $ref = new \ReflectionObject($obj);
        $var_list = $ref->getProperties();
        while (true) {
            $ref = $ref->getParentClass();
            if (empty($ref)) {
                break;
            }
            $var_list_new = $ref->getProperties();
            foreach ($var_list_new as $rpro) {
                if ($rpro->isPrivate()) {
                    $var_list[] = $rpro;
                }
            }
        }

        return $var_list;
    }
    /**
     * 使用反射取出类里面私有变量的值
     * 警告:这个方法会破坏类的封装,
     *      仅在修改别人代码,或者hook的时候使用
     * */
    public static function getPrivateValue($obj,$key)
    {
        $reflectionClass = new \ReflectionClass($obj);
        $property = $reflectionClass->getProperty($key);
        $property->setAccessible(true);
        $value = $property->getValue($obj);

        return $value;
    }
    /**
     * 返回类里面所有函数的名字
     */
    public static function getAllMethodName($class)
    {
        $ref = new \ReflectionClass($class);
        $methodList = $ref->getMethods();
        $output = array();
        foreach ($methodList as $methodRef) {
            $output[] = $methodRef->getName();
        }

        return $output;
    }
    public static function classFilePath($class)
    {
        $ref = new \ReflectionClass($class);
        $filePath = $ref->getFileName();

        return $filePath;
    }
}
